《Android开源库》 Realm For Android~ Migrations & Encryption & Working With Android(译文)

迁移(Migrations)

所有数据库都要处理模型改变的情况。Realm 的数据模型用标准 Java 对象来定义,改变Scheme和改变数据RealmObject子类对应的机构一样容易。

如果没有旧 Realm 数据文件存在,那么代码的改变即会反应到相应的 Realm 数据文件改变。但如果已经有旧版本的 Realm 数据文件存在,Realm 会抛出异常提示数据库文件需要迁移。请在相应的 RealmConfiguration 设置 schema 版本和 migration 代码来正确处理并避免该异常抛出。

1
2
3
4
RealmConfiguration config = new RealmConfiguration.Builder()
.schemaVersion(2) // Must be bumped when the schema changes
.migration(new MyMigration()) // Migration to run instead of throwing an exception
.build()

如上示例使得相应的 migration 代码在迁移需要的时候被自动执行。我们提供了相关 API 用来升级已保存的 schema 以及对应之前 schema 的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// Example migration adding a new class
RealmMigration migration = new RealmMigration() {
@Override
public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {

// DynamicRealm exposes an editable schema
RealmSchema schema = realm.getSchema();

// Migrate to version 1: Add a new class.
// Example:
// public Person extends RealmObject {
// private String name;
// private int age;
// // getters and setters left out for brevity
// }
if (oldVersion == 0) {
schema.create("Person")
.addField("name", String.class)
.addField("age", int.class);
oldVersion++;
}

// Migrate to version 2: Add a primary key + object references
// Example:
// public Person extends RealmObject {
// private String name;
// @PrimaryKey
// private int age;
// private Dog favoriteDog;
// private RealmList<Dog> dogs;
// // getters and setters left out for brevity
// }
if (oldVersion == 1) {
schema.get("Person")
.addField("id", long.class, FieldAttribute.PRIMARY_KEY)
.addRealmObjectField("favoriteDog", schema.get("Dog"))
.addRealmListField("dogs", schema.get("Dog"));
oldVersion++;
}
}
}

请查阅这个数据迁移例子来获取这方面的细节。

如果没有旧 Realm 数据文件存在,那么迁移并不需要,在这种情况下,Realm 会创建一个新的以 .realm 为后缀,基于新的对象模型的数据文件。在开发和调试过程中,假如你需要频繁改变数据模型,并且不介意损失旧数据,你可以直接删除 .realm 文件(这里包含所有的数据!)而不用关心迁移的问题。这在你应用的开发早期阶段非常有用。

1
2
3
4

RealmConfiguration config = new RealmConfiguration.Builder()
.deleteRealmIfMigrationNeeded()
.build()

加密

请注意我们的许可证的出口合规性部分,因为如果你位于从美国出口限制或禁运的国家,则会限制使用Realm。

Realm 文件可以通过传递一个512位(64字节)的密钥参数给 Realm.getInstance().encryptionKey() 来加密存储在磁盘上。

1
2
3
4
5
6
byte[] key = new byte[64];
new SecureRandom().nextBytes(key);
RealmConfiguration config = new RealmConfiguration.Builder()
.encryptionKey(key)
.build();
Realm realm = Realm.getInstance(config);

这保证了所有永久性存储在磁盘上的数据都是通过标准 AES-256 加密的。每次创建新的 Realm 实例的时候,都需要提供相同的密钥。

参考 examples/encryptionExample。这个例子演示了如何通过 Android KeyStore 来安全地存储密钥。

与 Android 相关

Realm 可以无缝地引入安卓开发。你需要谨记 RealmObject 的线程限制。当你需要跨 activity、service或者 broadcast receiver 传递 Realm 对象的时候,请牢记这一点.

原文地址

https://realm.io/docs/java/latest/#migrations

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×